package de.android.app.buddyfinder.gui;

import android.location.Location;
import android.os.Bundle;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;

import de.android.app.buddyfinder.R;

public class BuddyMapActivity extends MapActivity {

	/** Name of class. */
	private static final String CLASS_NAME = BuddyMapActivity.class
			.getSimpleName();

	/** MapView for showing Google Map. */
	private MapView mapView;

	/** MapController zur Steuerung der Kartenfunktionen. */
	private MapController mMapController;

	/**
	 * MyLocationOverlay für Detailinformationen in der Karte.
	 */
	private MyLocationOverlay mMyLocationOverlay;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.d(CLASS_NAME, "BuddyMapActivity->onCreate(): entered...");

		setContentView(R.layout.buddymap_anzeigen);

		initMapView();

		initMyLocationOverlay();
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}

	/**
	 * Stellt die MapView und deren Controller nach unseren Vorlieben ein.
	 * 
	 * <li>Zoomstufe</li> <li>Zoomkontrollen Anzeige</li> <li>Typ der
	 * angezeigten Karte</li>
	 * 
	 */
	private void initMapView() {
		mapView = (MapView) findViewById(R.id.mapview);
		mMapController = mapView.getController();

		final int maxZoomlevel = mapView.getMaxZoomLevel();
		Log.d(CLASS_NAME, "initMapView(): Max Zoom-Level: " + maxZoomlevel);
		mMapController.setZoom(maxZoomlevel - 4); // zoom

		// Blende bei Klick die Zoomkontrollen ein
		mapView.setBuiltInZoomControls(true);

		// mMapView.setSatellite(true); // Satellitenbild
		mapView.setStreetView(true); // Strassenansicht
	}

	/**
	 * Fuegt den Google Api Overlay zur Anzeige der eigenen Position hinzu.
	 */
	private void initMyLocationOverlay() {
		mMyLocationOverlay = new MyLocationOverlay(this, mapView) {

			/**
			 * Ueberschriebene callback Methode des Location Managers, um auf
			 * die eigene Position zu scrollen.
			 */
			@Override
			public void onLocationChanged(Location neuePosition) {
				super.onLocationChanged(neuePosition);
				Log.d(CLASS_NAME, "MyLocationOverlay->onLocationChanged "
						+ "aufgerufen mit: " + neuePosition);
				final GeoPoint eigenePosition = new GeoPoint(
						(int) (neuePosition.getLatitude() * 1E6),
						(int) (neuePosition.getLongitude() * 1E6));

				// hiermit wird die eigene Position immer
				// im Zentrum angezeigt:
				mMapController.animateTo(eigenePosition);
			}
		};

		mapView.getOverlays().add(mMyLocationOverlay);
		mMyLocationOverlay.enableMyLocation();
		mMyLocationOverlay.enableCompass();

		// nach der ersten Festlegung der eigenen Position
		// diese in der Mitte anzeigen
		mMyLocationOverlay.runOnFirstFix(new Runnable() {
			public void run() {
				mMapController.animateTo(mMyLocationOverlay.getMyLocation());
			}
		});
	}
}